<?php
/**
 * 转化 \ 为 /
 *
 * @param    string $path 路径
 * @return    string    路径
 */
function dir_path($path)
{
    $path = str_replace('\\', '/', $path);
    if (substr($path, -1) != '/') $path = $path . '/';
    return $path;
}

/**
 * 创建目录
 *
 * @param    string $path 路径
 * @param    string $mode 属性
 * @return    string    如果已经存在则返回true，否则为flase
 */
function dir_create($path, $mode = 0777)
{
    if (is_dir($path)) return TRUE;
    $ftp_enable = 0;
    $path = dir_path($path);
    $temp = explode('/', $path);
    $cur_dir = '';
    $max = count($temp) - 1;
    for ($i = 0; $i < $max; $i++) {
        $cur_dir .= $temp[$i] . '/';
        if (@is_dir($cur_dir)) continue;
        @mkdir($cur_dir, 0777, true);
        @chmod($cur_dir, 0777);
    }
    return is_dir($path);
}

/**
 * 拷贝目录及下面所有文件
 *
 * @param    string $fromdir 原路径
 * @param    string $todir 目标路径
 * @return    string    如果目标路径不存在则返回false，否则为true
 */
function dir_copy($fromdir, $todir)
{
    $fromdir = dir_path($fromdir);
    $todir = dir_path($todir);
    if (!is_dir($fromdir)) return FALSE;
    if (!is_dir($todir)) dir_create($todir);
    $list = glob($fromdir . '*');
    if (!empty($list)) {
        foreach ($list as $v) {
            $path = $todir . basename($v);
            if (is_dir($v)) {
                dir_copy($v, $path);
            } else {
                copy($v, $path);
                @chmod($path, 0777);
            }
        }
    }
    return TRUE;
}

/**
 * 转换目录下面的所有文件编码格式
 *
 * @param    string $in_charset 原字符集
 * @param    string $out_charset 目标字符集
 * @param    string $dir 目录地址
 * @param    string $fileexts 转换的文件格式
 * @return    string    如果原字符集和目标字符集相同则返回false，否则为true
 */
function dir_iconv($in_charset, $out_charset, $dir, $fileexts = 'php|html|htm|shtml|shtm|js|txt|xml')
{
    if ($in_charset == $out_charset) return false;
    $list = dir_list($dir);
    foreach ($list as $v) {
        if (pathinfo($v, PATHINFO_EXTENSION) == $fileexts && is_file($v)) {
            file_put_contents($v, iconv($in_charset, $out_charset, file_get_contents($v)));
        }
    }
    return true;
}

/**
 * 列出目录下所有文件
 *
 * @param    string $path 路径
 * @param    string $exts 扩展名
 * @param    array $list 增加的文件列表
 * @return    array    所有满足条件的文件
 */
function dir_list($path, $exts = '', $list = array())
{
    $path = dir_path($path);
    $files = glob($path . '*');
    foreach ($files as $v) {
        if (!$exts || pathinfo($v, PATHINFO_EXTENSION) == $exts) {
            if (is_dir($v)) {
                $list[] = dir_path($v);
                $list = dir_list($v, $exts, $list);
            } else {
                $list[] = $v;
            }
        }
    }
    return $list;
}

/**
 * 设置目录下面的所有文件的访问和修改时间
 *
 * @param    string $path 路径
 * @param    int $mtime 修改时间
 * @param    int $atime 访问时间
 * @return    array    不是目录时返回false，否则返回 true
 */
function dir_touch($path, $mtime = TIME, $atime = TIME)
{
    if (!is_dir($path)) return false;
    $path = dir_path($path);
    if (!is_dir($path)) touch($path, $mtime, $atime);
    $files = glob($path . '*');
    foreach ($files as $v) {
        is_dir($v) ? dir_touch($v, $mtime, $atime) : touch($v, $mtime, $atime);
    }
    return true;
}

/**
 * 目录列表
 *
 * @param    string $dir 路径
 * @param    int $parentid 父id
 * @param    array $dirs 传入的目录
 * @return    array    返回目录列表
 */
function dir_tree($dir, $parentid = 0, $dirs = array())
{
    global $id;
    if ($parentid == 0) $id = 0;
    $list = glob($dir . '*');
    foreach ($list as $v) {
        if (is_dir($v)) {
            $id++;
            $dirs[$id] = array('id' => $id, 'parentid' => $parentid, 'name' => basename($v), 'dir' => $v . '/');
            $dirs = dir_tree($v . '/', $id, $dirs);
        }
    }
    return $dirs;
}

/**
 * 删除目录及目录下面的所有文件
 *
 * @param    string $dir 路径
 * @return    bool    如果成功则返回 TRUE，失败则返回 FALSE
 */
function dir_delete($dir)
{
    $dir = dir_path($dir);
    if (!is_dir($dir)) return FALSE;
    $list = glob($dir . '*');
    foreach ($list as $v) {
        is_dir($v) ? dir_delete($v) : @unlink($v);
    }
    return @rmdir($dir);
}

/**
 * 遍历目录
 *$file 目录地址
 */
function dir_read($file)
{
    $dir = '';
    $file = dir_path($file);
    if (is_dir($file)) {
        if ($f = opendir($file)) {
            while ($read = readdir($f)) {
                if ($read != "." && $read != "..") {
                    $dir[] = $read;
                }
            }
        }
        closedir($f);
        return $dir;
    } else {
        return "不是目录";
    }
}

?>